Skip to content

[do-not-mirror][do-not-merge] chore(fork): give the gate a git identity - #20

Closed
jdsika wants to merge 4 commits into
integration/3.0from
chore/gate-git-identity
Closed

jdsika wants to merge 4 commits into
integration/3.0from
chore/gate-git-identity

Conversation

@jdsika

@jdsika jdsika commented Nov 11, 2026

Copy link
Copy Markdown

What

Gives the Fork gates workflow a git identity, and stops forkctl mirror from misreporting a cherry-pick that could not run.

Why

The first run of Fork gates on a real feature pull request failed on all three of #14, #15 and #17. forkctl mirror cherry-picks the commit onto pure upstream; a cherry-pick commits; a runner has no git identity. Git stopped with Committer identity unknown before merging anything.

This could not have been caught earlier. The chore path is exempt from Gate 2 (section 4.8), and a pull_request workflow cannot run on the feature path until it exists on the base branch -- which only happened when the previous chore commit was folded in.

Second defect, same failure: mirror attributed any non-zero cherry-pick to "the commit is entangled with fork-only state" and discarded git's stderr. That is a false accusation against a clean commit, and it cost a real debugging detour. A cherry-pick that stops with no unmerged paths never reached the merge, so the two are now distinguished and git's own message is shown.

Notes

ASCS-eV/PufferDrive is consumed as a git submodule internally while feeding
features back to Emerge-Lab/PufferDrive. This commit carries everything that
exists only in the fork, and is the single place fork-only content lives.

Branch model:
  3.0              verbatim, fast-forward-only mirror of upstream/3.0
  integration/3.0  default branch; this commit plus a linear stack of
                   single-commit features; what internal consumers pin
  feature/<slug>   one feature, exactly one commit
  mirror/<slug>    cherry-picked onto pure upstream/3.0 for upstream PRs

integration/3.0 is the default branch because GitHub reads the PR template,
the contributing guidelines, the agent instructions and scheduled workflows
only from the default branch, and none of those files may exist on 3.0
without destroying the mirror. A clone checks out the default branch, so the
copy of the instructions here is the process as far as every agent and every
submodule consumer is concerned; a rule that lives only in an open PR has no
effect.

Nothing reaches integration/3.0 until three gates pass:
  1. CI green on the final commit.
  2. Adversarial review by someone other than the author, with the findings
     written down -- including the probes that found nothing.
  3. Upstream-readiness proven rather than asserted: the commit cherry-picks
     onto a branch cut from pure upstream/3.0 and produces an upstream-clean
     diff. We stack only commits we could contribute today.

chore(fork): commits are exempt from gate 3, since fork-only infrastructure
can never be upstream-ready. They carry two orthogonal markers: do-not-mirror
(must never reach upstream) and do-not-merge (the merge button is never
pressed -- merging would create a second chore(fork): commit and break the
single-commit invariant that every sync asserts). Such a PR is folded into
this commit by fixup and closed unmerged.

Contents:
- .github/copilot-instructions.md: normative process for coding agents
- CONTRIBUTING.md: human orientation, same rules
- .github/pull_request_template.md: testing and stack-hygiene gates
- .github/workflows/sync-mirror.yml: fast-forward-only mirror sync that
  refuses any non-fast-forward instead of rewriting the upstream base
- AGENTS.md / CLAUDE.md: fenced pointer so agents find the fork process
  without colliding with upstream-owned content
- ci.yml / install.yml: run CI for PRs targeting integration/3.0, which
  upstream's branch filters would otherwise skip

A standing draft PR from integration/3.0 into 3.0 gives a continuous CI
verdict on the combined stack; it must never be merged.

Everything here is fork-only and must never be cherry-picked upstream.
The Linux CI jobs fail while installing the package:

    [Errno 122] Disk quota exceeded

Errno 122 is EDQUOT, hit while unpacking the CUDA torch stack that
`pip install -e .` resolves by default. torch alone is 554.6 MB and the
accompanying nvidia-* wheels add another ~2.4 GB, which no longer fits
the runner's quota. The failure occurs during "Installing build
dependencies", i.e. the isolated PEP 517 build environment is already
enough to exceed it on its own.

The trigger is a runner image change, not a code change:

  * upstream 11_bernhard_dev, 2026-10-20, Image: ubuntu-24.04 -> success
  * same workflows, 2026-10-23, Image: ubuntu-26.04 -> failure

Both resolve an identical wheel set (torch 2.14.1, 554.6 MB). The
`ubuntu-latest` label began migrating to Ubuntu 26 on 2026-10-19
(actions/runner-images#14748), between those two runs. Both workflows
already carry "Free up disk space" steps, so these jobs were running
close to the limit before the migration.

Fix: install CPU-only torch from download.pytorch.org, then build with
--no-build-isolation so the build reuses it instead of resolving torch
a second time. --no-build-isolation needs the build dependencies present
up front, hence the explicit setuptools/wheel/numpy install; the
`setuptools<81` bound matches the pin already in install_requires.

This loses no coverage: BUILD_CUDA_EXT keys off CUDA_HOME/ROCM_HOME,
which is unset on these runners, so the CUDA sources were never compiled
here. tests/smoke_tests/Dockerfile already installs torch this way.

macOS keeps the plain `pip install -e .` unchanged: its PyPI wheels are
already CPU-only, and leaving it alone keeps the default PEP 517
build-isolation path under test somewhere in the matrix.
The shipped puffer_drive.yaml sets policy.fused_slot_encoder=true, and
DriveBackbone raises ImportError when that is set without triton. Two CI
jobs build a policy straight from the shipped config, so Unit Tests and
Notebook Execution have been failing on every pull request:

  ImportError: fused_slot_encoder=true requires triton

The smoke and eval suites already pin the flag off for exactly this reason;
these two call sites were simply missed. test_action_selection only exercises
the discrete-to-continuous action table, which the fused kernel has no part
in, so it pins the flag off outright. The inference notebook keeps the kernel
whenever it has a CUDA device and drops it otherwise, which is also what a
reader running the notebook on a laptop needs.

Neither change touches the training path or the kernel itself: with triton
and a GPU present, both call sites behave exactly as before.
The first run of `Fork gates` on a real feature pull request failed on
every one of them. `forkctl mirror` cherry-picks the commit onto pure
upstream, a cherry-pick commits, and a runner has no git identity, so git
stopped with "Committer identity unknown" before it ever merged anything.
The chore path never caught this because section 4.8 exempts it from
Gate 2, and the feature path could not run in CI until the workflow
existed on the base branch.

`mirror` also reported that failure as "the commit is entangled with
fork-only state" and swallowed what git actually said, which is a false
accusation against a clean commit and sends the reader looking for
fork-only content that is not there. A cherry-pick that stops without
unmerged paths never reached the merge, so the two cases are now told
apart and git's own message is printed.
@jdsika jdsika added do-not-mirror Fork-only change; must never be sent to Emerge-Lab/PufferDrive do-not-merge Never use the merge button; applied by fixup (3.3) or never merged at all labels Nov 11, 2026
@jdsika

jdsika commented Nov 11, 2026

Copy link
Copy Markdown
Author

Folded into the fork base and closed unmerged, per section 3.3.

  • New fork base: fffe8fd0917f3186ce308a93cc9e65238e245605
  • New integration/3.0 tip: 17e264a0edcn- fork-only/3.0 republished in the same atomic push.

Validation: test_forkctl.py 127 passed, pre-commit passed, check-stack 13/13 PASS. The product tree is byte-identical to the tip that make test already passed -- only the three fork-only files differ -- so the sim suites were not re-run.

The fix is exercised on the feature path only; #14, #15 and #17 are the proof.

@jdsika jdsika closed this Nov 11, 2026
@jdsika
jdsika deleted the chore/gate-git-identity branch November 11, 2026 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge Never use the merge button; applied by fixup (3.3) or never merged at all do-not-mirror Fork-only change; must never be sent to Emerge-Lab/PufferDrive

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant